home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Programmer Disk
/
The Programmer Disk (Microforum).iso
/
xpro
/
bc
/
pro8
/
katest.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-05-29
|
12KB
|
460 lines
/***************************************************************************
* KATEST.C - Test for the key access System
*
* THIS PROGRAM REQUIRES THE USE OF THE SORT MODULE.
* ALL KAFS (KEYED ACCESS FILE SYSTEM) LINES ARE DENOTED BY
* A COMMENT BEGINNING WITH: $$KAFS$$
*
***************************************************************************/
#include <stdio.h>
#include <string.h>
#include <alloc.h>
#include <stdlib.h>
#include "KATEST.H"
#define SOF -1
extern long rec;
extern char key[];
struct courserec course; /* Define the Course File Structure */
char password[]="password";
void main();
void pgmxit();
void mcourse();
int rf_course();
void courselist();
void w_putp(int row, int col, char *str);
void w_pc(int row, int col);
int w_penter(int row, int col, char *str, int len);
int w_enter(char str[], int len);
void error(char *es);
void main()
{
int sel;
int recsize;
recsize = sizeof(course); /* $$KAFS$$ Find out Record Sizes */
if(ka_open(COURSEFILE,"COURSE")!=OK) /* $$KAFS$$ Open the course file */
{
putchar(7);
printf("\n$$$ CANNOT OPEN COURSE FILE $$$\n");
getch();
return;
}
while(TRUE)
{
clrscr();
printf(" KAFS - Keyed Access File System\n\n");
printf(" TEST APPLICATION\n\n\n\n\n");
printf(" 1 - (C)ourse Maintenance\n\n");
printf(" 2 - (L)ist Courses\n\n");
printf(" 3 - (Q)uit to DOS\n");
w_pc(24,2);
printf("Course Record Size is %d\n",recsize);
sel=toupper(getch());
switch(sel)
{
case '1':
case 'C':
mcourse();
break;
case '2':
case 'L':
courselist();
break;
case '3':
case 'Q':
case 27:
pgmxit();
break;
}
}
}
/*********************************
* PGMXIT - End Progrm
*********************************/
void pgmxit()
{
ka_close_all(); /* $$KAFS$$ Close all Open KAFS Files */
clrscr();
exit(0);
}
/****************************************************
* MCOURSE
******************************************************/
void mcourse()
{
int wcc, eflag;
char resp[250];
char ans;
float tf; /* Temp float */
while(TRUE)
{
cedit:
clrscr();
memset(&course, 0, sizeof(course));
gotoxy(1,2);
puts(" Course Number:\n");
puts(" Course Name:");
puts(" Instructor:");
puts(" Units:");
puts(" Per Unit Cost:");
puts(" Notes:");
puts(" Commission:\n");
puts(" Total Course Cost: $$ to MJM:");
puts(" Worksheet Only Cost: $$ to MJM:");
strcpy(course.cnum,"");
if(w_penter(2,17,course.cnum,9)==ESC) break;
if(rf_course()) /* Read for Course, if found display Values */
{
w_putp(4,17,course.cname);
w_putp(5,17,course.inst);
w_putp(8,17,course.note);
sprintf(resp,"%5d",course.units);
w_putp(6,17,resp);
sprintf(resp,"%4.2f",course.pucost);
w_putp(7,17,resp);
w_pc(9,17);
putch(course.comm);
sprintf(resp,"%5.2f",course.pucost * course.units);
w_putp(11,23,resp);
sprintf(resp,"%5.2f",course.mjmamt);
w_putp(11,45,resp);
sprintf(resp,"%5.2f",course.wsonly);
w_putp(12,23,resp);
sprintf(resp,"%5.2f",course.mjmwso);
w_putp(12,45,resp);
eflag=TRUE;
}
else
{
if(strlen(course.cnum)==0) goto cedit;
putchar(7);
w_putp(15,4,"COURSE Not Found, Create COURSE (Y/N)?");
do{ans=tolower(getch());} while(ans != 'y' && ans !='n' && ans !=ESC);
w_pc(15,1);
printf(" ");
if(ans != 'y') goto cedit;
eflag = FALSE;
}
w_pc(4,17);
if(w_enter(course.cname,30)==ESC) goto cedit;
if(eflag && !strcmpi(course.cname,"delete"))
{
putchar(7);
w_putp(15,4,"ENTER PASSWORD TO DELETE:");
strcpy(resp,"");
w_enter(resp,10);
w_pc(15,1);
printf(" ");
if(strcmpi(resp,password))
{
error("INVALID PASSWORD");
goto cedit;
}
rdelete(COURSEFILE, rec); /* $$KAFS$$ DELETE This Record */
error("RECORD DELETED");
goto cedit;
}
w_pc(5,17);
if(w_enter(course.inst,20)==ESC) goto cedit;
sprintf(resp,"%5d",course.units);
w_pc(6,17);
if(w_enter(resp,33)==ESC) goto cedit;
course.units = atoi(resp);
sprintf(resp,"%4.2f",course.pucost);
w_pc(7,17);
if(w_enter(resp,4)==ESC) goto cedit;
course.pucost = atof(resp);
w_pc(8,17);
if(w_enter(course.note,35)==ESC) goto cedit;
gcflg:
if(!eflag) course.comm='N';
sprintf(resp,"%c",course.comm);
w_pc(9,17);
printf(" ");
if(w_enter(resp,1)==ESC) goto cedit;
if(resp[0]!='Y' && resp[0]!='N')
{
error(" Y or N only");
goto gcflg;
}
course.comm = resp[0];
sprintf(resp,"%5.2f",course.pucost * course.units);
w_putp(11,23,resp);
/* Allow Editing the Course Amounts to MJM */
w_pc(11,45);
sprintf(resp,"%5.2f",course.mjmamt);
if(w_enter(resp, 6)==ESC) goto cedit; /* Edit the mjm Amt */
course.mjmamt = atof(resp);
w_pc(12,23);
if(!eflag) course.wsonly = (course.pucost * course.units) - 25;
sprintf(resp,"%5.2f",course.wsonly);
if(w_enter(resp,6)==ESC) goto cedit;
course.wsonly = atof(resp);
w_pc(12,45);
sprintf(resp,"%5.2f",course.mjmwso);
if(w_enter(resp, 6)==ESC) goto cedit; /* Edit mjm wso amt */
course.mjmwso = atof(resp);
if(eflag)
{
if(write_upd(COURSEFILE, &course)!=OK) /* $$KAFS$$ Update the Record */
error("ERROR UPDATING RECORD"); /* UPDATE */
}
else
{
if(write_key(COURSEFILE, course.cnum, &course)!=OK) /* $$KAFS$$ Create NEW Record */
error("ERROR WRITING RECORD"); /* NEW REC */
}
}
}
/*******************************************************************
* rf_course - record find a course
* returns TRUE if found else FALSE
**************************************************************************/
int rf_course()
{
rec = SOF; /* $$KAFS$$ Set for read to begin at beginning of file */
if(read_key(COURSEFILE, course.cnum, &course)==OK) /* $$KAFS$$ Read by key */
return(TRUE);
else return(FALSE);
}
/***********************************************************************
* COURSELIST - Course List Sorted by coursenumber
***********************************************************************/
void courselist()
{
int ccode, sortsize, sortcount;
int noteflag, invflag;
int soption;
char ans;
char ts[20]; /* Temp String */
char rptline[133];
float value;
clrscr();
invflag=FALSE;
w_putp(5,2,"DO YOU WANT INVOICING INFORMATION (Y/N)? ");
do{ans=tolower(getch());} while(ans != 'y' && ans !='n' && ans !=ESC);
if(ans==ESC) goto crxit;
if(ans=='y') invflag = TRUE;
putch(toupper(ans));
noteflag=FALSE;
if(invflag==FALSE)
{
w_putp(7,2,"DO YOU WANT COURSE NOTES PRINTED (Y/N)? ");
do{ans=tolower(getch());} while(ans != 'y' && ans !='n' && ans !=ESC);
if(ans==ESC) goto crxit;
if(ans=='y') noteflag = TRUE;
putch(toupper(ans));
}
sortsize = sizeof(course.cnum);
if(initsort(sortsize) != OK)
{
error("NO SORT SPACE");
goto crxit;
}
w_putp(9,25,"SORT IN PROGRESS\n");
rec=SOF; /* $$KAFS$$ Set for read to begin at beginning of file */
while(read_seq(COURSEFILE, &course)==OK) /* $$KAFS$$ Read Sequentially */
{
sort(course.cnum,rec);
}
if(sortcount < 1)
{
error("NO RECORDS TO SORT");
goto crxit;
}
if(merge()!=OK)
{
error("MERGE ERROR");
goto crxit;
}
clrscr();
printf("COURSE LIST\n\n");
if(invflag)
printf("COURSE # COURSE NAME UNITS COST WSONLY MJMAMT WSOAMT\n");
else
printf("COURSE # COURSE NAME INSTRUCTOR UNITS COST\n");
printf("-----------------------------------------------------------------------------\n");
while(TRUE)
{
rec = fetch(); /* $$KAFS$$ Set Rec to value from fetch */
if(rec == SORTERR || rec == FETCHEND) break; /* $$KAFS$$ check rec value */
read_rec(COURSEFILE, &course); /* $$KAFS$$ Read by value in rec */
if(invflag)
sprintf(rptline,"%-9s %-31s%3d %6.2f %6.2f %6.2f %6.2f\n",
course.cnum,course.cname,course.units,course.pucost * course.units,
course.wsonly, course.mjmamt, course.mjmwso);
else
sprintf(rptline,"%-9s %-31s %-21s %3d %6.2f\n",
course.cnum,course.cname,course.inst,course.units,
course.pucost * course.units);
printf("%s",rptline);
if(noteflag)
{
if(strlen(course.note)> 0)
{
sprintf(rptline," NOTES: %s\n",course.note);
printf("%s",rptline);
}
printf("\n");
}
}
printf("************* REPORT END ************");
getch();
crxit:
endsort(); /* Free the Sort buffer */
}
/***************************************************************************
* Screen Postioning and keyboard entry routines
***************************************************************************/
void w_putp(int row, int col, char *str)
{
gotoxy(col, row);
printf("%s",str);
}
void w_pc(int row, int col)
{
gotoxy(col, row);
}
int w_penter(int row, int col, char *str, int len)
{
w_pc(row, col);
return(w_enter(str, len));
}
int w_enter(char str[], int count)
{
int c, pos, x;
if(str[0]!=0) pos = strlen(str);
else pos = 0;
str[pos] = '\0'; /* Terminate the string just in case */
if(pos>0)
{
printf("%s",str); /* we're in edit mode */
x=1; /* Set Xout mode */
}
else x=0; /* NO Xout if not editing */
do {
c = getch(); /* get a character from stdin */
if (c ==0) /* Got a Screen Control indicator */
{
c = getch(); /* waste the control code */
if (c == DELETE)
{
while(pos) {putch(BKSP);putch(SPACE);putch(BKSP);pos--;} /* Delete The Field */
}
c=255; /* Invalidate, it was a control code */
}
if (c == ESC || c == ENTER) break; /* We're done !! */
if(x)
{
if(c>=SPACE) while(pos)
{
putch(BKSP);
putch(SPACE);
putch(BKSP);
pos--;
}
x=0; /* Cancel it now that we've done it */
}
/** See if the character is a backspace **/
if (c == BKSP)
{
if(pos == 0)
putch(BELL); /* If nothing entered, can't backspace */
else
{
putch(BKSP); /* Do a Backspace */
putch(SPACE);
putch(BKSP);
pos--;
}
}
else
/** See if we are at the end of the buffer. If so, only accept an end **/
if (pos <= count-1)
{
if (c >= SPACE && c < ASCIITOP)
{
c=toupper(c);
str[pos] = c; /* add the character to buffer */
putch(c); /* display it */
pos++; /* advance the buffer pointer */
}
else putch(BELL);
}
else putch(BELL);
} while ( c != ESC && c != ENTER);
str[pos] = '\0'; /* Terminate the input string */
return(c);
}
void error(char *es)
{
putch(BELL);
gotoxy(2,24);
printf("%s",es);
getch();
gotoxy(2,24);
printf(" ");
}